package com.hyper_yang._05_juc.chap09;

import java.util.concurrent.atomic.AtomicInteger;

/*class DataOne{
    private Integer number = 0;
    //private volatile Integer number = 0;  //volatile不能保证原子性。可以保证可见性和有序性。

    //1000线程并发执行调用,出现资源共享问题。
    public Integer incr(){
        return ++number; // Java中   ++ -- 不是原子的。
    }
}*/

/*class DataOne{

    private  Integer number = 0;
    //private volatile Integer number = 0;  //volatile不能保证原子性。可以保证可见性和有序性。

    //1000线程并发执行调用,出现资源共享问题。
    public synchronized Integer incr(){ //增加同步锁解决资源共享的问题。保证  ++ -- 原子性。
        return ++number; // Java中   ++ -- 不是原子的。
    }
}*/

/**
 * volatile 不能保证原子性 ==> 使用 synchronized锁串行化 or Atomic类型
 *
 * CAS（Compare and Swap，比较并交换）是一种乐观锁机制
 * 包含三个操作数:
 * obj + offset: 内存位置
 * v: 预期原值
 * v + delta: 新值
 */
class DataOne{

    //JUC中提供了10+个原子类。可以保证并发数据操作安全。
    private AtomicInteger number = new AtomicInteger(0);

    public Integer incr(){
        return number.incrementAndGet();  // 进行 ++i
//        return number.getAndIncrement();  // 进行 i++
    }
}

public class VolatileAtomicDemo {

    public static void main(String[] args) {

        DataOne dataOne = new DataOne();

        for (int i = 0; i < 1000; i++) {
            new Thread(() -> {
                System.out.println(dataOne.incr());
            }).start();
        }
    }
}